#include <iostream>

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;
using namespace cv::ml;

int main(int argc, char **argv)
{
    if (argc < 2) {
        cout << "Usage: " << argv[0] << " <filename>" << endl;
        return 0;
    }

    Mat image = imread("image1.png"); // 读取原图
    Mat templ = imread("image2.png", 0); // 读取模板图的灰度图像

    Mat src;
    cvtColor(image, src, COLOR_RGB2GRAY); // 将原图转换为灰度图像

    Mat result(src.rows - templ.rows + 1, src.cols - templ.cols + 1, CV_32FC1); // 构建结果矩阵
    matchTemplate(src, templ, result, TM_CCOEFF_NORMED); // 模板匹配

    double dMaxVal; // 分数最大值
    Point ptMaxLoc; // 最大值坐标
    minMaxLoc(result, 0, &dMaxVal, 0, &ptMaxLoc); // 寻找结果矩阵中的最大值

    // 匹配结果的四个顶点
    Point pt1(ptMaxLoc.x, ptMaxLoc.y);
    Point pt2(ptMaxLoc.x + templ.cols, ptMaxLoc.y);
    Point pt3(ptMaxLoc.x, ptMaxLoc.y + templ.rows);
    Point pt4(ptMaxLoc.x + templ.cols, ptMaxLoc.y + templ.rows);

    // 画线
    line(image, pt1, pt2, cv::Scalar(0, 255, 0), 11, 1);
    line(image, pt2, pt4, cv::Scalar(0, 255, 0), 11, 1);
    line(image, pt4, pt3, cv::Scalar(0, 255, 0), 11, 1);
    line(image, pt3, pt1, cv::Scalar(0, 255, 0), 11, 1);

    imshow("image", image);
    imwrite("img.jpg", image);
    waitKey();

    return 0;
}